<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>constructor</title>
	<meta name="author" content="Stark" />
	<!-- Date: 2018-10-19 -->
	<script type="text/javascript">
		/**
		 * 为了让定义的方式更加符合Java的需求，就把定义方法的原型代码放置到Person这个构造函数中
		 */
		function Person(name,age,friends) {
			// 属性在构造函数中定义
			this.name = name;
			this.age = age;
			this.friends = friends;
			// 不能使用重写的方式定义
			/*Person.prototype = {
				constructor:Person,
				// 方法在原型中定义
				say:function() {
					alert(this.name+"["+this.friends+"]");
				}
			}*/
			/**
			 * 判断Person.prototype是否存在，如果不存在就表示需要创建
			 * 当存在之后就不会在创建了
			 */
			if(!Person.prototype.say) {
				alert("aaa");
				Person.prototype.say = function() {
					alert(this.name+"["+this.friends+"]");
				}
			}
		}
		
		// 此时所有的属性都是保存在自己的空间中的
		var p1 = new Person("Leno",23,["Ada","Chris"]);
		p1.name = "John";
		p1.friends.push("Mike");	// 为p1增加了一个朋友
		p1.say();	// Jonh[Ada,Chris,Mike]
		var p2 = new Person("Ada",33,["Leno"]);
		// 此时原型中就多了一个Mike,这就是原型所带来的问题
		p2.say();	// Leno[Ada,Chris]
	</script>
</head>
<body>

</body>
</html>

